#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "logmanager.h"
#include <QMessageBox>

// ✅ 在 MainWindow 构造函数中，创建所有页面后添加：

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
    , currentUserId(-1)
    , currentUserRole("")
{
    ui->setupUi(this);

    // 创建页面管理器实例
    usermanager = new UserManager(this);
    devicemanager = new DeviceManager(this);
    datamonitor = new DataMonitor(this);
    alertmanager = new AlertManager(this);
    logmanager = new LogManager(this);
    page_video = new Page_video(this);
    page_control = new Page_control(this);

    // 将串口管理器传递给控制页面
    page_control->setDataMonitor(datamonitor);

    // 连接数据监控的传感器数据更新信号到设备控制页面
    connect(datamonitor, &DataMonitor::sensorDataUpdated,
            page_control, &Page_control::updateSensorDataFromSerial);

    // ✅ 新增：将DataMonitor和Page_control传递给AlertManager
    alertmanager->setDataMonitor(datamonitor);
    alertmanager->setPageControl(page_control);

    setupPages();

    // 默认选中第一个菜单项
    ui->listWidget->setCurrentRow(0);
    onMenuClicked(ui->listWidget->item(0));

    // 将页面添加到堆栈窗口
    ui->stackedWidget->insertWidget(0, usermanager);
    ui->stackedWidget->insertWidget(1, devicemanager);
    ui->stackedWidget->insertWidget(2, datamonitor);
    ui->stackedWidget->insertWidget(3, alertmanager);
    ui->stackedWidget->insertWidget(4, logmanager);
    ui->stackedWidget->insertWidget(5, page_video);
    ui->stackedWidget->insertWidget(6, page_control);

    // 菜单栏"退出用户"动作连接槽函数
    connect(ui->actionExit, &QAction::triggered, this, &MainWindow::onExitAction);

    // 连接菜单项点击信号
    connect(ui->listWidget, &QListWidget::itemClicked, this, &MainWindow::onMenuClicked);

    // 记录系统日志
    LogManager::logSystem("主窗口", "主窗口初始化完成");
}

MainWindow::~MainWindow()
{


    // 记录系统日志
    LogManager::logSystem("主窗口", "主窗口销毁");
    delete ui;
}



// 设置当前用户信息(从登录界面调用)
void MainWindow::setCurrentUserInfo(int userId, const QString &role)
{
    this->currentUserId = userId;
    this->currentUserRole = role;

    // 设置窗口标题显示当前用户
    this->setWindowTitle(QString("蜗牛物联网监控平台 v1.0 - 用户: %1")
                        .arg(role == "admin" ? "管理员" : "普通用户"));

    // 记录登录日志
    LogManager::logSystem("主窗口",
                        QString("用户登录主界面 | ID:%1 | 角色:%2")
                        .arg(userId).arg(role));

    // 传递用户信息到各个模块
    if (usermanager) {
        usermanager->setCurrentUserInfo(userId, role);
    }

    if (devicemanager) {
        devicemanager->setCurrentUserId(userId);
        devicemanager->setCurrentUserRole(role);
    }

    if (datamonitor) {
        datamonitor->setCurrentUserId(userId);
    }

    if (alertmanager) {
        alertmanager->setCurrentUserRole(role);
    }

    if (logmanager) {
        logmanager->setCurrentUserRole(role);
    }

    // 应用权限设置
    applyUserPermissions();
}

void MainWindow::setupAlertConnection()
{
    if (datamonitor && alertmanager) {
        datamonitor->setAlertManager(alertmanager);
        LogManager::logSystem("主窗口", "数据监控与告警管理模块连接成功");
    } else {
        if (!datamonitor) {
            datamonitor = new DataMonitor(this);
            ui->stackedWidget->insertWidget(2, datamonitor);
        }
        if (!alertmanager) {
            alertmanager = new AlertManager(this);
            ui->stackedWidget->insertWidget(3, alertmanager);
        }

        if (datamonitor && alertmanager) {
            datamonitor->setAlertManager(alertmanager);
            LogManager::logSystem("主窗口", "数据监控与告警管理模块重新连接成功");
        }
    }
}

void MainWindow::setupPages()
{
    ui->listWidget->clear();
    ui->listWidget->addItem("用户管理");
    ui->listWidget->addItem("设备管理");
    ui->listWidget->addItem("数据监控");
    ui->listWidget->addItem("告警管理");
    ui->listWidget->addItem("日志管理");
    ui->listWidget->addItem("视频管理");
    ui->listWidget->addItem("设备控制");
}

// 根据用户角色应用权限设置
void MainWindow::applyUserPermissions()
{
    if (currentUserRole == "admin") {
        // ============ 管理员:所有功能可用 ============
        // 所有菜单项都可见可用
        for (int i = 0; i < ui->listWidget->count(); i++) {
            QListWidgetItem *item = ui->listWidget->item(i);
            item->setHidden(false);
            item->setFlags(item->flags() | Qt::ItemIsEnabled);
            item->setForeground(Qt::black);
            item->setToolTip("");
        }

        LogManager::logSystem("权限管理",
                            QString("管理员用户登录,开放所有功能"));

    } else if (currentUserRole == "user") {

        // ============ 普通用户:限制功能 ============

        for (int i = 0; i < ui->listWidget->count(); i++) {
            QListWidgetItem *item = ui->listWidget->item(i);

            if (item->text() == "日志管理") {
                // 隐藏日志管理
                item->setHidden(true);

            } else {

                item->setHidden(false);
                item->setFlags(item->flags() | Qt::ItemIsEnabled);
                item->setForeground(Qt::black);
                item->setToolTip("");
            }
        }

        LogManager::logSystem("权限管理",
                            QString("普通用户登录,应用权限限制"));
        LogManager::logOperation(currentUserId, "权限设置",
                               "已应用普通用户权限:禁用日志管理", "", "");
    }
}

void MainWindow::onMenuClicked(QListWidgetItem *item)
{
    if (!item) return;

    int index = ui->listWidget->row(item);
    QString menuName = item->text();

    // 防止普通用户通过其他方式访问日志管理
    if (currentUserRole == "user" && menuName == "日志管理") {
        QMessageBox::warning(this, "权限不足",
                           "您没有权限访问日志管理模块!\n此功能仅限管理员使用。");

        LogManager::logOperation(currentUserId, "访问被拒绝",
                               QString("用户尝试访问日志管理模块被拒绝"),
                               "", "");

        // 切换回第一个可用菜单
        ui->listWidget->setCurrentRow(0);
        ui->stackedWidget->setCurrentIndex(0);
        return;
    }

    // 切换到对应页面
    ui->stackedWidget->setCurrentIndex(index);
}

// 退出当前用户,返回登录界面
void MainWindow::onExitAction()
{
    int result = QMessageBox::question(this,
                                       tr("确认退出"),
                                       tr("确定要退出当前用户并返回登录界面吗?"),
                                       QMessageBox::Yes | QMessageBox::No);

    if (result == QMessageBox::Yes) {
        // 记录退出日志
        LogManager::logOperation(currentUserId, "用户登出",
                               QString("用户退出系统"),
                               "", "");
        LogManager::logSystem("主窗口",
                            QString("用户登出"));

        emit logoutRequested();
    } else {
        // 记录取消退出
        LogManager::logOperation(currentUserId, "取消登出",
                               "用户取消退出操作", "", "");
    }
}
